<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 实现一个new

  function Preson(name, age) {
    this.name = name
    this.age = age
  }
  Preson.prototype.say = function() {
    console.log('我是' + this.name + ',今年' + this.age + '岁了')
  }
  function createPerson(name, age) {
    const o = {}
    Preson.call(o, name, age)
    o._proto_ = Preson.prototype
    return o
  }
  const p1 = createPerson('张三', 18)
  p1.say
  console.log(p1)

/* 

       // 模具扣出来的月饼需要具备通用方法或者属性
       function Person (name,age) {
         this.name = name
         this.age = age
      }
      // 模具扩展的方法
      Person.prototype.eat = function () {
        console.log(this.name + "_在吃饭" )
      }
       // 模具扩展的方法
      Person.prototype.sleep = function () {
        console.log(this.name + "_在睡觉" )
      }
       // 模具扩展的方法
      Person.prototype.play = function () {
        console.log(this.name + "_在玩游戏" )
      }

      // new的时候做了什么事 
      function createPerson (name, age) {
        const o = {} // 先声明一个空对象
        // call() apply(改变this指向并立刻执行) / bind（改变this指向 返回这个函数）
       // Person.call(o, name, age) // 改变this指向o 传入name和age
        Person.apply(o, [name, age]) // 改变this指向o 传入name和age
        o.__proto__ = Person.prototype // 继承构造函数的所有原型属性
        return o // 返回这个对象
      }

     const p = new Person("老高", 35) // 独立的月饼
     const p1 = new Person("小张", 25) // 独立的月饼
     const p2 = createPerson("小明", 30)
    
     p.eat()
     p1.play() 
     p2.sleep() */
    
    
/*      是es6推出的构造函数，用来解决异步编程的问题，用来解决回调地狱(回调嵌套)问题
最早的发请求
$.ajax({
   url: '',
   data: '',
   success(result) {
     $.ajax({
       url: '',
      success(result1) {
        ...
        } 
    })
     
   }
}) */


     //三种状态
     new Promise(() => {})  // pending 
new Promise((resolve, reject) => {
  resolve()
}) // fullfiled
new Promise((resolve, reject) => {
  reject()
})  // rejected

  // 基础用法
  new Promise((resolve, reject) => {
        // resolve 成功
        // reject失败
        reject(1)
       })
       .then((result) => {
      
       })
       .catch(error => {
        
       })
       .finally(() => {
        alert("finally")
       })



/* 有await必须它的父级函数必须标记async
标记async的函数是一个promise

await 永远会等待它后面的promise进行resolve
 */

    async function test (){
    //return1//正常的返回fullfiled状态
    return Promise.reject(new Error("失败了"))}
    async function testl (){
    try {
    const result = await test()
    alert(result)}
    catch (error){
    alert(error.message)
    }
    }
    test1()











  </script>
</body>
</html>